# -*- coding: utf-8 -*-


labels=u"""
运动鞋
休闲
培训
狗
励志
美术
求职
台湾
低档
粤菜
健身操
电台
智能
广播
快餐
极限
港
中东
咨询
手机
护肤品
咖啡厅
灵异
早教
男装
洗护
简约
中档
美式
财经
电影
热水器
曲艺
首饰
宝宝
药品
旅游
阅读
游
旅行箱
美化
珠宝
童车
服务
商品房
别墅
商业
篮球
电脑
品牌
物业
东南亚
母婴
数码
跑步
日常
东北菜
足球
游泳
中国
高尔夫球
女装
书法
宜家
女鞋
台球
通讯
医疗
高端
自助餐
鲜花
奶粉
器材
网络
云南
电视剧
实用
科技
课程
快捷
房
装
时尚
卖房
鱼
绿
包
语言
火锅
钓鱼
体育
拖鞋
游戏机
度假村
料理
舞蹈
美容
摄影
杂志
新疆
家电
外卖
军事
网页
小说
社交
美甲
鸟
家政
手表
冰箱
游戏
管理
地铁
育儿
改装
成功
情侣
西餐
二手房
网球
法律
孕婴
物流
租车
香水
素菜
设备
服装
陪驾
亲子
厨房
代购
言情
奢侈品
手
殡葬
学习
动漫
清真
风格
湘菜
家具
酒吧
单车
职场
定制
影音
美体
车展
剧
送餐
护理
高档
生活
奇闻
置业
空调
商务
广告
钱包
留学
田园
用品
审计
娱乐
社区
人文
纪录片
团购
自制
洗衣机
家庭
灯具
国内游
武侠
妈妈
回收
英文
保健
西医
工具
豪车
中式
出行
维修
社会
滑雪
背包
瑜伽
购物
新房
内衣
安全
澳
都市
办公
电器
原版
创业
星级
典当
海鲜
建材
器械
私房
湿巾
出国游
宠物
旅舍
个人
植
家纺
公寓式
纸尿裤
运动装
二
青春
团
汽车
搬家
小吃
海外
婚
微
跟
时政
资讯
家居服
童鞋
书
韩国
电脑包
会计
胎教
饰品
贵金属
中医
技能
安保
欧洲
日本
川菜
学区
旅馆
综艺
厨具
翻译
少
买房
辅食
新能源
代驾
应用
系统
收藏
创意
戏曲
考试
菜谱
健身房
外汇
电视
配送
装修
羽毛球
户外
童装
政策
音乐
养生
豪华
烹饪
乒乓球
小食
文学
理财
跆拳道
房屋
租赁
男
男鞋
欧式
花卉
礼服
科幻
儿
自助游
美发
艺术
图像
银行
道具
庆
比价
玩具
采摘
游乐场
喝茶
美国
市场
家教
淘
运动
健身
菜
桌
经济
酒店
辅助
家居
童床
二手车
社科
眼镜
报刊
八卦
棋牌
彩妆
台
女
青
玄幻
海
爬山
温泉
历史
自驾游
猫
模拟
        """

service_labels = u"""手机，话费，充值, 支付，移动，联通，电信
手机，剩余，话费，余额，查询，流量，移动，联通，电信
手机，流量，充值,支付，移动，联通，电信
生活，缴费，水费，燃气，电费，固话，宽带，有线，电视，支付
币，充值，游戏，支付，交易
日常，保洁，卫生，打扫
丽人，美甲
鲜花，配送
外卖，超市，购物
果蔬，生鲜, 水果，生鲜
洗衣，家纺，窗帘
打车，旅行
酒店，优选，酒店，预订，旅行
机票，机票，预订，旅行
航班，查询,航班，动态，旅行
租车，自驾，租车，专车，接送，旅行
火车票， 抢票，旅行
景点，门票，旅行
代驾，旅行
汽车票，旅行
旅行，攻略，游记，攻略，旅行
电影票，影院， 娱乐
演出，票务，演唱会，音乐会，话剧，歌剧，儿童，亲子，娱乐
医院，挂号,医院，生活
快递，查询，快递，单号，生活
快递，附近，生活
违章，查询，车牌号，发动机，违章，罚款，扣分， 生活
团购，美食，休闲，娱乐，小吃，快餐，生活
名品，特卖，美妆，男装，女装，鞋，包，生活
摇号，查询，摇号，生活
汽车，报价，选车，生活
三星，商城，三星，手机，平板，耳机，电池，充电器，生活
附近，生活，吃喝，玩乐，出行，购物"""


user_profile_labels = u"""
汽车
公交
"""

service_names = u"""phone_call_recharge
check_phone_balance
phone_data_recharge
utilities
refill_game_coins
house_keeping
beauty
flower_delivery
food_delivery
fresh_food
laundry
taxi
hotel
air_ticket
check_flight
rental_car
train_ticket
attraction_ticket
chauffer_service
bus_ticket
travel_guides
movie_ticket
show_ticket
hors
check_express
send_express
query_traffic_peccancy
group_purchase
shopping
car_lottery
car_quote
samsung_shop
nearby"""

from preprocess import my_word2vec


def extract_keywords(str):
    import re

    keywords = re.split(u'\n|，|,|\*|;|\t', str)

    # keywords = keywords.split('\n')

    labels = set()
    for key in keywords:
        key = key.strip()
        if len(key) != 0:
            labels.add(key)

    return labels


import numpy as np

service_names = service_names.split("\n")

labels_keywords = list(extract_keywords(labels))
service_keywords = list(extract_keywords(service_labels))
user_profile_keywords = list(extract_keywords(user_profile_labels))


labels_num = len(labels_keywords)
services_keywords_num = len(service_keywords)
user_profile_num = len(user_profile_keywords)

print labels_num,services_keywords_num,user_profile_num

word_vector_model = 'model/news-163_word_vector.bin'
wv = my_word2vec.Convert2Vector(word_vector_model)


#################################################
# compute matrix of between user profile and service
m0 = np.zeros((user_profile_num, services_keywords_num))
def compute_m0():
    for i in range(user_profile_num):
        for j in range(services_keywords_num):
            m0[i][j] = wv.cosine_dist(user_profile_keywords[i], service_keywords[j])
compute_m0()
# show matrix
def show_matrix_user_profile_and_service0():
    for i in range(user_profile_num):
        print user_profile_keywords[i],
    print ""

    for i in range(services_keywords_num):
        print service_keywords[i],
    print ""

    for i in range(user_profile_num):
        for j in range(services_keywords_num):
            print m0[i][j],
        print ""
show_matrix_user_profile_and_service0()

#################################################
# compute matrix of between labels and service
m1 = np.zeros((labels_num, services_keywords_num))
def compute_m1():
    for i in range(labels_num):
        for j in range(services_keywords_num):
            m1[i][j] = wv.cosine_dist(labels_keywords[i], service_keywords[j])
#compute_m1()
# show matrix
def show_matrix_label_and_service():
    for i in range(labels_num):
        print labels_keywords[i],
    print ""

    for i in range(services_keywords_num):
        print service_keywords[i],
    print ""

    for i in range(labels_num):
        for j in range(services_keywords_num):
            print m1[i][j],
        print ""
#show_matrix_label_and_service()
#################################################
# compute matrix of between labels and user profile
m2 = np.zeros((user_profile_num,labels_num))
def compute_m2():
    for i in range(user_profile_num):
        for j in range(labels_num):
            m2[i][j] = wv.cosine_dist(user_profile_keywords[i],labels_keywords[j])
#compute_m2()
# show matrix
def show_matrix_label_and_user_profile():

    for i in range(user_profile_num):
        print user_profile_keywords[i],
    print ""

    for i in range(labels_num):
        print labels_keywords[i],
    print ""

    for i in range(user_profile_num):
        for j in range(labels_num):
            print m2[i][j],
        print ""
#show_matrix_label_and_user_profile()

#################################################
# compute matrix of between service and user profile
def compute_m():
    m = np.dot(m2,m1)
#compute_m()
# show matrix
def show_matrix_user_profile_and_service():
    for i in range(user_profile_num):
        print user_profile_keywords[i],
    print ""

    for i in range(services_keywords_num):
        print service_keywords[i],
    print ""

    for i in range(user_profile_num):
        for j in range(services_keywords_num):
            print m[i][j],
        print ""
#show_matrix_user_profile_and_service()

###################################################

def weight_by_idf_for_each_keywords_in_services():
    service_keywords = []
    service_keywords_raw = service_labels.split('\n')
    for s in service_keywords_raw:
        service_keywords.append(extract_keywords(s))

    print len(service_keywords)

    from DataMining import TF_IDF

    idf = TF_IDF.IDF_MODE()
    idf.load("model/news-163-idf.model")


    services = []
    for s in service_keywords:
        #print len(s),
        sum_idf = 0
        service_keywords_weights=[]
        for i in s:
            assert( i in idf)
            #print i+"-"+str(idf[i]),
            sum_idf += idf[i]

        for i in s:
            service_keywords_weights.append((i,idf[i]/sum_idf))
        services.append(service_keywords_weights)

        #print ""

    return services



services_weight = weight_by_idf_for_each_keywords_in_services()




#################################################
#test 1
for i in range(user_profile_num):
    user_profile_index = i
    user_profile_key = user_profile_keywords[user_profile_index]
    index = m0[user_profile_index].argmin()
    print str(i),". ",user_profile_key, "-", service_keywords[index]

# test 2

def get_services_rank_by_features(featrues = [0]):
    keywords_map = {}
    mm = np.zeros((services_keywords_num))
    for f in featrues:
        print user_profile_keywords[f],
        mm += m0[f]

    for i in range(services_keywords_num):
        keywords_map[service_keywords[i]] = mm.max() - mm[i]
    #index = mm.argmin()
    #print "-",service_keywords[index]
    services_sum_weight_list = []

    for i in range(len(services_weight)):
        services_sum_weight = 0
        for w in services_weight[i]:
            keyword = w[0]
            weight = w[1]
            services_sum_weight += (weight * keywords_map[keyword])

        services_sum_weight_list.append((service_names[i],services_sum_weight))

    services_sum_weight_list.sort(key=lambda x:x[1],reverse=True)
    return services_sum_weight_list


services_rank = get_services_rank_by_features()
print ""
for s in services_rank:
    print s[0],s[1]

pass

